/**
 * Author : Jorge Mejuto Create : 13/05/2010
 */

package net.eyra.negocio.explotacion.informes.diario.DatosExternos;

import java.awt.BasicStroke;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.TreeMap;

import net.eyra.utiles.Path;
import net.eyra.utiles.Periodo;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.ui.RectangleInsets;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;

public class DatosOMEL {

    /**
     * 
     * @param mes
     *            . 1: Enero, 2: Febrero ....
     * @param año
     * @return
     * @throws IOException
     */
    public TreeMap<String, Double> CargarPrecioMedioDiario(int dia, int mes, int año) throws IOException {
        TreeMap<String, Double> valores = null;
        Periodo periodo = new Periodo(mes - 1, año);
        int dias = periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIAS_MES);
        String dias_mes = dias < 10 ? "0" + dias : String.valueOf(dias);

        String s_mes = mes < 10 ? "0" + mes : String.valueOf(mes);

        String s_url = "http://www.omel.es/informes_mercado/AGNO_" + año + "/MES_" + s_mes + "/TXT/INT_MERCADO_DIARIO_MIN_MAX_9_01_" + s_mes + "_"
                + año + "_" + dias_mes + "_" + s_mes + "_" + año + ".txt";

        URL url = new URL(s_url);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String linea, pagina = "";
        int con_lineas = 1;
        while ((linea = in.readLine()) != null)
            if (con_lineas > 3 && linea.length() > 4) pagina += linea;
            else con_lineas++;

        in.close();
        StringTokenizer tokens = new StringTokenizer(pagina, ";");
        valores = new TreeMap<String, Double>();
        while (tokens.hasMoreElements()) {
            String fecha = tokens.nextToken();
            int _dia = Integer.parseInt(fecha.substring(0, 2));
            double precio = 0;
            try {
                String _precio = (tokens.hasMoreElements()) ? (String) tokens.nextToken() : "";
                if (_precio.length() > 0 && _precio.indexOf("/") < 0 && _dia <= dia) {
                    precio = Double.parseDouble(_precio.replace(",", "."));
                    tokens.nextToken();
                    tokens.nextToken();
                } else return valores;

            } catch (NumberFormatException e) {
            }
            valores.put(fecha, precio);
        }
        return valores;
    }

    public Image CrearImagenPrecioMedioMercadoDiario(TreeMap<String, Double> valores) throws BadElementException, MalformedURLException, IOException,
                                                                                     ParseException {

        Iterator<String> iterator = valores.keySet().iterator();

        TimeSeries ts = new TimeSeries("Precio Medio Mercado Diario");
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");

        while (iterator.hasNext()) {
            String fecha = (String) iterator.next();
            ts.add(new Day(sdf.parse(fecha)), valores.get(fecha).doubleValue());
        }

        TimeSeriesCollection dataset = new TimeSeriesCollection();
        dataset.addSeries(ts);

        JFreeChart chart = ChartFactory.createTimeSeriesChart("Precio Medio Mercado Diario", "Día del Mes", "Precio (€)", dataset, false, true, false);

        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
        plot.setDomainCrosshairVisible(true);
        plot.setRangeCrosshairVisible(true);

        XYItemRenderer r = plot.getRenderer();
        if (r instanceof XYLineAndShapeRenderer) {
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
            renderer.setBaseShapesVisible(true);
            renderer.setBaseShapesFilled(true);

            renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
            Font font = new Font("Arial", Font.PLAIN, 10);
            renderer.setBaseItemLabelFont(font);
            renderer.setBaseItemLabelsVisible(true);
        }

        r.setSeriesStroke(0, new BasicStroke(4f));

        DateAxis axis = (DateAxis) plot.getDomainAxis();
        axis.setDateFormatOverride(new SimpleDateFormat("dd"));
        axis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY, 1));

        Image imagen = Image.getInstance(ChartUtilities.encodeAsPNG(chart.createBufferedImage(800, 500)));
        imagen.setAlignment(Element.ALIGN_CENTER);
        return imagen;
    }

    public Image CargarImagenPrecioMedioMercadoDiario(int mes, int año) throws BadElementException {
        Periodo periodo = new Periodo(mes - 1, año);
        int dias = periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIAS_MES);
        String dias_mes = dias < 10 ? "0" + dias : String.valueOf(dias);

        String s_mes = mes < 10 ? "0" + mes : String.valueOf(mes);

        String s_url = "http://www.omel.es/informes_mercado/AGNO_" + año + "/MES_" + s_mes + "/GJPG/INT_MERCADO_DIARIO_MIN_MAX_9_01_" + s_mes + "_"
                + año + "_" + dias_mes + "_" + s_mes + "_" + año + ".gif";

        try {
            return Image.getInstance(s_url);
        } catch (ConnectException e) {
            // s_url = "/home/jorge/Desarrollo/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/eyra_2.5"
            // + Path.getPathImagenes() + "no_imagen_omel.gif";
            s_url = Path.getPathImagenes() + "no_imagen_omel.gif";
            try {
                return Image.getInstance(s_url);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
                return null;
            } catch (IOException e1) {
                e1.printStackTrace();
                return null;
            }
        } catch (IOException e) {
            // s_url = "/home/jorge/Desarrollo/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/eyra_2.5"
            // + Path.getPathImagenes() + "no_imagen_omel.gif";
            s_url = Path.getPathImagenes() + "no_imagen_omel.gif";
            try {
                return Image.getInstance(s_url);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
                return null;
            } catch (IOException e1) {
                e1.printStackTrace();
                return null;
            }
        }
    }
}
